from typing import Any, Optional

# 用来简化数据类的定义
from dataclasses import dataclass
from sqlalchemy import (
    MetaData,
    Table,
    Column,
    Integer,
    String,
    Date,
    Enum,
    DECIMAL,
    TIMESTAMP,
)
from datetime import datetime
from config import logger


# 定义数据库连接信息的数据类
@dataclass
class DatabaseConnection:
    host: str
    port: str
    user: str
    password: str
    database: str
    engine: Optional[Any] = None
    session: Optional[Any] = None

    def close(self) -> None:
        if self.engine:
            try:
                self.engine.dispose()
                logger.info("数据库连接已经关闭")
            except Exception as e:
                logger.error(f"数据库关闭失败:{str(e)}")


# 数据库表结构的管理类
class DatabaseSchema:
    def __init__(self):
        self.metadata = MetaData()
        self._setup_table()

    def _setup_table(self) -> None:
        """设置数据库表结构"""
        # 定义学生表
        Table(
            "students",  # 表名
            self.metadata,  # 关联的元数据对象
            Column(
                "student_id", Integer, primary_key=True, autoincrement=True
            ),  # 学生ID，主键，自增
            Column(
                "student_no", String(20), nullable=False, unique=True
            ),  # 学号，唯一且不能为空
            Column("student_name", String(20), nullable=False),  # 学生姓名，不能为空
            Column("gender", Enum("男", "女"), default="男"),  # 性别，枚举类型，默认男
            Column("class_name", String(20), nullable=False),  # 班级名称，不能为空
            Column("birth_date", Date),  # 出生日期
            Column("parent_phone", String(15)),  # 家长电话
            Column(
                "create_time", TIMESTAMP, default=datetime.now
            ),  # 创建时间，默认当前时间
        )

        # 定义科目表
        Table(
            "subjects",  # 表名
            self.metadata,  # 关联的元数据对象
            Column(
                "subject_id", Integer, primary_key=True, autoincrement=True
            ),  # 科目ID，主键，自增
            Column(
                "subject_name", String(20), nullable=False, unique=True
            ),  # 科目名称，唯一且不能为空
            Column("teacher_name", String(20)),  # 任课老师姓名
            Column(
                "create_time", TIMESTAMP, default=datetime.now
            ),  # 创建时间，默认当前时间
        )

        # 定义成绩表
        Table(
            "scores",  # 表名
            self.metadata,  # 关联的元数据对象
            Column(
                "score_id", Integer, primary_key=True, autoincrement=True
            ),  # 成绩ID，主键，自增
            Column("student_id", Integer, nullable=False),  # 学生ID，不能为空
            Column("subject_id", Integer, nullable=False),  # 科目ID，不能为空
            Column("exam_date", Date, nullable=False),  # 考试日期，不能为空
            Column(
                "exam_type",
                Enum("期中", "期末", "单元测试", "月考"),
                default="期末",  # 考试类型，枚举，默认期末
            ),
            Column("score", DECIMAL(5, 2), nullable=False),  # 分数，定点数，不能为空
            Column(
                "grade_level", Enum("优秀", "良好", "及格", "不及格")
            ),  # 等级，枚举类型
            Column(
                "create_time", TIMESTAMP, default=datetime.now
            ),  # 创建时间，默认当前时间
        )

    def get_metadata(self):
        return self.metadata
